void sqlite3MaterializeView( Parse pParse, / Parsing context / Table pView, / View definition / Expr pWhere, / Optional WHERE clause to be added / int iCur / Cursor number for ephemerial table / ){ SelectDest dest; Select pDup; sqlite3 db = pParse->db; pDup = sqlite3SelectDup(db, pView->pSelect, 0); if( pWhere ){ SrcList pFrom; pWhere = sqlite3ExprDup(db, pWhere, 0); pFrom = sqlite3SrcListAppend(db, 0, 0, 0); if( pFrom ){ assert( pFrom->nSrc==1 ); pFrom->a[0].zAlias = sqlite3DbStrDup(db, pView->zName); pFrom->a[0].pSelect = pDup; assert( pFrom->a[0].pOn==0 ); assert( pFrom->a[0].pUsing==0 ); }else{ sqlite3SelectDelete(db, pDup); } pDup = sqlite3SelectNew(pParse, 0, pFrom, pWhere, 0, 0, 0, 0, 0, 0); } sqlite3SelectDestInit(&dest, SRT_EphemTab, iCur); sqlite3Select(pParse, pDup, &dest); sqlite3SelectDelete(db, pDup); }函数的结果是把视图存放在一个临时的表空间中,之后用Expr *sqlite3LimitWhere函数产生一个表达树来实现DELETE and UPDATE语句中的WHERE, ORDER BY, LIMIT/OFFSET 部分
调用函数 sqlite3SelectDup()、sqlite3ExprDup()、sqlite3SrcListAppend()、sqlite3DbStrDup()、sqlite3SelectDelete()、sqlite3SelectNew()、sqlite3SelectDestInit()、sqlite3Select()、sqlite3SelectDelete()